home *** CD-ROM | disk | FTP | other *** search
- {PASCAL VERSION OF WADUZITDO}
- PROGRAM WADUZITDO;
-
- CONST PZ=5000; BS=127; EOL=10;STRLEN=80;
-
- TYPE STR=STRING[STRLEN];
-
- VAR LOC,LST,I,E,C : INTEGER;
- LCHR,FLG,CBUF,CH,CURS,CBS,CEOL : CHAR;
- S : STR;
- FLAG, RUN, DONE: BOOLEAN;
- PROG : ARRAY[1..PZ] OF CHAR;
-
- PROCEDURE CHIN;
- BEGIN
- IF FLAG THEN
- BEGIN
- E := 1;
- WRITE (CURS);
- READ(S);
- FLAG := FALSE
- END;
- IF E > LENGTH(S) THEN
- BEGIN
- E := 1;
- WRITELN;
- WRITE (CURS);
- READ (S);
- CBUF := CHR(EOL)
- END
- ELSE
- BEGIN
- C := ORD(S[E]);
- IF C = $1B THEN
- BEGIN
- DONE := TRUE;
- C := $20
- END;
- CH := CHR(C);
- CBUF := CH;
- E := E + 1
- END;
- END;
-
- PROCEDURE CHOUT;
- BEGIN
- IF CBUF = CHR(EOL) THEN
- WRITELN
- ELSE
- WRITE (CBUF);
- END;
-
- PROCEDURE NEWLINE;
- BEGIN
- WRITELN;
- END;
-
- PROCEDURE LIST;
- VAR I: INTEGER;
- BEGIN
- I := 0;
- LOC := LOC - 1;
- REPEAT
- CBUF := PROG [LOC];
- LOC := LOC + 1;
- I := I + 1;
- CHOUT
- UNTIL (I>64) OR (CBUF=CEOL);
- NEWLINE
- END;
-
- PROCEDURE LISTALL;
- VAR J : INTEGER;
- BEGIN
- J := 0;
- LOC := 1;
- REPEAT
- LIST;
- J := J + 1
- UNTIL (PROG[LOC+1] = 'S') OR (J = 10);
- NEWLINE
- END;
-
- PROCEDURE EXECUTE;
-
- BEGIN
- LOC :=1;
- CURS := '#';
- REPEAT
- CBUF := PROG[LOC];
- IF CBUF < '*' THEN
- CBUF := '*';
- IF NOT (CBUF IN ['*','Y','N','A','M','J','T','S']) THEN
- LIST
- ELSE
- CASE CBUF OF
- '*': LOC := LOC+1;
- 'Y': IF CBUF = FLG THEN
- LOC := LOC + 1
- ELSE
- REPEAT
- CBUF := PROG[LOC];
- WRITE (CBUF);
- LOC := LOC + 1
- UNTIL CBUF = CEOL;
-
- 'N': IF CBUF = FLG THEN
- LOC := LOC + 1
- ELSE
- REPEAT
- CBUF := PROG[LOC];
- WRITE (CBUF);
- LOC := LOC + 1
- UNTIL CBUF = CEOL;
- 'A' : BEGIN
- LST := LOC;
- CHIN;
- LCHR := CBUF;
- NEWLINE;
- LOC := LOC + 2
- END;
- 'M' : BEGIN
- IF LCHR = PROG[LOC+2] THEN
- FLG := 'Y'
- ELSE
- FLG := 'N';
- LOC := LOC + 3
- END;
- 'J' : IF PROG[LOC+2] = '0' THEN
- LOC := LST
- ELSE
- BEGIN
- I := ORD(PROG[LOC+2])-48;
- REPEAT
- LOC := LOC + 1;
- IF PROG[LOC] = '*' THEN
- I := I - 1;
- UNTIL I = 0
- END;
- 'T' : BEGIN
- LOC := LOC + 2;
- LIST
- END;
- 'S' : BEGIN
- DONE := TRUE;
- LOC := 1
- END
- END
- UNTIL DONE
- END;
-
- begin
- CBS := CHR(BS);
- CEOL := CHR(EOL);
- CBUF := '\';
- FLAG := TRUE;
- RUN := TRUE;
- while RUN do
- begin
- CURS := '*';
- if CBUF = '\' then
- LOC := 1
- else if CBUF = CBS then
- LOC := LOC - 1
- else if CBUF = '/' then
- LIST
- else if CBUF = '=' then
- LISTALL
- else if CBUF = '$' then
- BEGIN
- DONE := FALSE;
- EXECUTE
- END
- else if CBUF = '!' then
- RUN := FALSE
- else if CBUF = '%' then
- begin
- I := 0;
- while (I<64) and (PROG[LOC] <> CEOL) do
- begin
- PROG[LOC] := CHR(0);
- LOC := LOC + 1
- end;
- PROG[LOC] := CEOL;
- LOC := LOC + 1
- end
- else begin
- PROG[LOC] := CBUF;
- LOC := LOC + 1
- end;
- if RUN then
- begin
- CURS := '*';
- CHIN
- end
- END
- END.
-